﻿using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Windows.Forms;
using DevExpress.Web.ASPxGridView;
using DevExpress.Web.ASPxEditors;

public partial class Usuarios : System.Web.UI.Page
{
	#region Propiedades publicas

	public DataSet UsuariosDS
	{
		get
		{
			if (Session["Usuarios"] == null)
			{
				UsuariosData usuariosData = new UsuariosData(ConfigurationManager.ConnectionStrings["StrConexionServidor"].ConnectionString);
				Session["Usuarios"] = usuariosData.GetUsuarios();
				((DataSet)Session["Usuarios"]).Tables[0].PrimaryKey = new DataColumn[]{((DataSet)Session["Usuarios"]).Tables[0].Columns["nombre"]};
			}
			
			return (DataSet)Session["Usuarios"];
		}
	}

	#endregion

	#region Eventos generales pagina

	protected void Page_Load(object sender, EventArgs e)
   {
		ConfigurarValidacionesGrilla();
		if (!IsPostBack)
			LlenarGrillaUsuarios();
	}

	#endregion

	//--------------- USUARIOS ------------------//

	#region Grilla usuarios - Validaciones

	private void ConfigurarValidacionesGrilla()
	{
		ConfigurarValidacionesColumna((GridViewDataTextColumn)ASPxGridViewUsuarios.Columns["nombre"], true, 50, true);
		ConfigurarValidacionesColumna((GridViewDataTextColumn)ASPxGridViewUsuarios.Columns["contrasenia"], true, 50, true);
	}

	private void ConfigurarValidacionesColumna(GridViewDataTextColumn columna, bool requerido, int maxLong, bool validarAlDejar)
	{
		if(requerido)
		{
			columna.PropertiesTextEdit.ValidationSettings.RequiredField.IsRequired = requerido;
			columna.PropertiesTextEdit.ValidationSettings.RequiredField.ErrorText = string.Format(Resources.GlobalResources.ErrorCampoRequerido, columna.Caption);
		}

		columna.PropertiesTextEdit.MaxLength = maxLong;
		columna.PropertiesTextEdit.ValidationSettings.ValidateOnLeave = validarAlDejar;
	}

	#endregion

	#region Grilla usuarios - Eventos

	protected void ASPxGridViewUsuarios_Load(object sender, EventArgs e)
	{
		LlenarGrillaUsuarios();
	}

	protected void ASPxGridViewUsuarios_CustomJSProperties(object sender, DevExpress.Web.ASPxGridView.ASPxGridViewClientJSPropertiesEventArgs e)
	{
		e.Properties["cpIsEditing"] = ASPxGridViewUsuarios.IsEditing;
	}

	protected void ASPxGridViewUsuarios_CellEditorInitialize(object sender, ASPxGridViewEditorEventArgs e)
	{
		if (e.Column.FieldName == "nombre")
			e.Editor.ReadOnly = !ASPxGridViewUsuarios.IsNewRowEditing;
		else
			e.Editor.ReadOnly = false;

		ASPxTextBox box = e.Editor as ASPxTextBox;
		if (box == null) return;
		box.ClientSideEvents.KeyDown = "editor_KeyDown";
	}

	#endregion

	#region Grilla usuarios - ABM

	protected void ASPxGridViewUsuarios_RowInserting(object sender, DevExpress.Web.Data.ASPxDataInsertingEventArgs e)
	{
		try
		{
			UsuariosData usuariosData = new UsuariosData(ConfigurationManager.ConnectionStrings["StrConexionServidor"].ConnectionString);
            DUsuario usuario = new DUsuario(e.NewValues["nombre"].ToString(), e.NewValues["contrasenia"].ToString());
			usuariosData.AgregarUsuario(usuario);

			AddRowToDataSet(usuario);
		}
		catch (Exception ex)
		{
			Logger.log(ConfigurationManager.AppSettings["PathToLog"], ex.Message + "\n" + ex.StackTrace);
			MessageBox.Show("Ocurrió un error al insertar el usuario. Ver log para más información.");
		}

		e.Cancel = true;
		ASPxGridViewUsuarios.CancelEdit();
		LlenarGrillaUsuarios();
	}

	private void AddRowToDataSet(DUsuario usuario)
	{
		UsuariosDS.AcceptChanges();
		DataRow newRow = UsuariosDS.Tables[0].NewRow();
		newRow["nombre"] = usuario.nombre;
		newRow["contrasenia"] = usuario.contrasenia;
		UsuariosDS.Tables[0].Rows.Add(newRow);
	}

	protected void ASPxGridViewUsuarios_RowUpdating(object sender, DevExpress.Web.Data.ASPxDataUpdatingEventArgs e)
	{
		try
		{
			UsuariosData usuariosData = new UsuariosData(ConfigurationManager.ConnectionStrings["StrConexionServidor"].ConnectionString);
            DUsuario usuario = new DUsuario(e.OldValues["nombre"].ToString(), e.NewValues["contrasenia"].ToString());
			usuariosData.ModificarUsuario(usuario);

			ModifyRowOnDataSet(usuario);
		}
		catch (Exception ex)
		{
            Logger.log(ConfigurationManager.AppSettings["PathToLog"], ex.Message + "\n" + ex.StackTrace);
			MessageBox.Show("Ocurrió un error al actualizar el usuario. Ver log para más información.");
		}

		e.Cancel = true;
		ASPxGridViewUsuarios.CancelEdit();
	}

	private void ModifyRowOnDataSet(DUsuario usuario)
	{
		UsuariosDS.AcceptChanges();
		DataRow row = UsuariosDS.Tables[0].Rows.Find(usuario.nombre);
		row["contrasenia"] = usuario.contrasenia;
	}

	protected void ASPxGridViewUsuarios_RowDeleting(object sender, DevExpress.Web.Data.ASPxDataDeletingEventArgs e)
	{
		try
		{
			UsuariosData usuariosData = new UsuariosData(ConfigurationManager.ConnectionStrings["StrConexionServidor"].ConnectionString);
            DUsuario usuario = new DUsuario(e.Values["nombre"].ToString(), string.Empty);
			usuariosData.EliminarUsuario(usuario);

			DeleteRowOnDataSet(usuario);
		}
		catch (Exception ex)
		{
            Logger.log(ConfigurationManager.AppSettings["PathToLog"], ex.Message + "\n" + ex.StackTrace);
			MessageBox.Show("Ocurrió un error al eliminar el usuario. Ver log para más información.");
		}

		e.Cancel = true;
		ASPxGridViewUsuarios.CancelEdit();
	}

	private void DeleteRowOnDataSet(DUsuario usuario)
	{
		UsuariosDS.AcceptChanges();
		UsuariosDS.Tables[0].Rows.Find(usuario.nombre).Delete();
	}

	private void LlenarGrillaUsuarios()
	{
		try
		{
			if (Utiles.TieneDatos(UsuariosDS))
			{
				ASPxGridViewUsuarios.DataSource = UsuariosDS.Tables[0];
				ASPxGridViewUsuarios.DataBind();
			}
		}
		catch (Exception ex)
		{
            Logger.log(ConfigurationManager.AppSettings["PathToLog"], ex.Message + "\n" + ex.StackTrace);
			MessageBox.Show("Ocurrió un error al llenar la grilla de usuarios. Ver log para más información.");
		}
	}

	#endregion	
}